/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package sd_proj1.monSolution;

import genclass.GenericIO;
import genclass.TextFile;
import java.util.Iterator;
import java.util.TreeMap;

/**
 *
 * @author Pedro Costa Correia - 32795
 * @author Valter Pedro Lopes Vicente - 39360
 */
public class Log {

	/**
	 *  Nome a atribuir ao ficheiro de log.
	 *
	 *    @serialField fileName
	 */
	private String fileName = "log.txt";
	/**
	 *  TreeMap usada para manipulação das mensagens.
	 *
	 *    @serialField map
	 */
	private TreeMap map = new TreeMap();

	/**
	 * Construtor nulo do objecto log
	 */
	public Log() {
	}

	/**
	 *  Construtor do objecto Log, com o nome do ficheiro e a TreeMap para produção do ficheiro de texto.
	 * @param fileName Nome a atribuir ao ficheiro de log.
	 * @param map A TreeMap que contêm as mensagens.
	 */
	public Log(String fileName, TreeMap map) {
		if ((fileName != null) && !("".equals(fileName))) {
			this.fileName = fileName;
			this.map = map;
		}
	}

	/**
	 * Construção do ficheiro ordenado retirando objectos do tipo mensagem de uma TreeMap que é passada a todos os monitores.
	 * Só vai ser alterado o campo que tenha sido modificado de linha para linha.
	 */
	public void reportFinalStatus() {
		int i = 0;
		TextFile log = new TextFile();
		Message linhaant = (Message) map.get(i);// instanciação de uma variável de tipo ficheiro de texto
		String c1, c2, c4, c6, c8, c10, c12, c14;
		char c17, c18;
		int c3, c5, c7, c9, c11, c13, c15, c16, c19, c20, c21, c22, c23;
		c1 = linhaant.getEntrepStat().toString();
		c2 = linhaant.getstatCustomer1().toString();
		c3 = linhaant.getBP0();
		c4 = linhaant.getstatCustomer2().toString();
		c5 = linhaant.getBP1();
		c6 = linhaant.getstatCustomer3().toString();
		c7 = linhaant.getBP2();
		c8 = linhaant.getstatCraftsman1().toString();
		c9 = linhaant.getPP0();
		c10 = linhaant.getstatCraftsman2().toString();
		c11 = linhaant.getPP1();
		c12 = linhaant.getstatCraftsman3().toString();
		c13 = linhaant.getPP2();
		c14 = linhaant.getStatShop().toString();
		c15 = linhaant.getNCI();
		c16 = linhaant.getSNPI();
		c17 = linhaant.getPCR();
		c18 = linhaant.getPMR();
		c19 = linhaant.getAPMI();
		c20 = linhaant.getWNPI();
		c21 = linhaant.getNSPM();
		c22 = linhaant.getTAPM();
		c23 = linhaant.getTNP();

		if (!log.openForWriting(".", fileName)) {
			GenericIO.writelnString("A operação de criação do ficheiro " + fileName + " falhou!");
			System.exit(1);
		}
		log.writelnString("                Aveiro Handicraft SARL - Description of the internal state");
		log.writelnString("ENTREPRE  CUST_0  CUST_1  CUST_2   CRAFT_0 CRAFT_1 CRAFT_2          SHOP                 WORKSHOP");
		log.writelnString("  Stat   Stat BP Stat BP Stat BP   Stat PP Stat PP Stat PP  Stat NCI NPI PCR PMR  APMI NPI NSPM TAPM TNP");

		Iterator it = map.keySet().iterator();
		Object obj;
		it.next();
		while (it.hasNext()) {
			obj = it.next();

			Message linha = (Message) map.get(obj);

			if (linha.getEntrepStat() != linhaant.getEntrepStat() && linha.getEntrepStat() != null) {
				c1 = linha.getEntrepStat().toString();
			}

			if (linha.getstatCustomer1() != linhaant.getstatCustomer1() && linha.getstatCustomer1() != null) {
				c2 = linha.getstatCustomer1().toString();
			}

			if (c3 != linha.getBP0() && linha.getBP0() != 0) {
				c3 = linha.getBP0();
			}

			if (linha.getstatCustomer2() != linhaant.getstatCustomer2() && linha.getstatCustomer2() != null) {
				c4 = linha.getstatCustomer2().toString();
			}

			if (c5 != linha.getBP1() && linha.getBP1() != 0) {
				c5 = linha.getBP1();
			}

			if (linha.getstatCustomer3() != linhaant.getstatCustomer3() && linha.getstatCustomer3() != null) {
				c6 = linha.getstatCustomer3().toString();
			}

			if (c7 != linha.getBP2() && linha.getBP2() != 0) {
				c7 = linha.getBP2();
			}

			if (linha.getstatCraftsman1() != linhaant.getstatCraftsman1() && linha.getstatCraftsman1() != null) {
				c8 = linha.getstatCraftsman1().toString();
			}

			if (c9 != linha.getPP0() && linha.getPP0() != 0) {
				c9 = linha.getPP0();
			}

			if (linha.getstatCraftsman2() != linhaant.getstatCraftsman2() && linha.getstatCraftsman2() != null) {
				c10 = linha.getstatCraftsman2().toString();
			}

			if (c11 != linha.getPP1() && linha.getPP1() != 0) {
				c11 = linha.getPP1();
			}

			if (linha.getstatCraftsman3() != linhaant.getstatCraftsman3() && linha.getstatCraftsman3() != null) {
				c12 = linha.getstatCraftsman3().toString();
			}

			if (c13 != linha.getPP2() && linha.getPP2() != 0) {
				c13 = linha.getPP2();
			}

			if (linha.getStatShop() != linhaant.getStatShop() && linha.getStatShop() != null) {
				c14 = linha.getStatShop().toString();
			}

			if (c15 != linha.getNCI() && linha.getNCI() != -1) {
				c15 = linha.getNCI();
			}

			if (c16 != linha.getSNPI() && linha.getSNPI() != -1) {
				c16 = linha.getSNPI();
			}

			if (c17 != linha.getPCR() && linha.getPCR() != '0') {
				c17 = linha.getPCR();
			}

			if (c18 != linha.getPMR() && linha.getPMR() != '0') {
				c18 = linha.getPMR();
			}

			if (c19 != linha.getAPMI() && linha.getAPMI() != -1) {
				c19 = linha.getAPMI();
			}

			if (c20 != linha.getWNPI() && linha.getWNPI() != -1) {
				c20 = linha.getWNPI();
			}

			if (c21 != linha.getNSPM() && linha.getNSPM() != -1) {
				c21 = linha.getNSPM();
			}

			if (c22 != linha.getTAPM() && linha.getTAPM() != -1) {
				c22 = linha.getTAPM();
			}

			if (c23 != linha.getTNP() && linha.getTNP() != -1) {
				c23 = linha.getTNP();
			}

			log.writelnString("  " + c1 + "   "
				+ c2 + " " + c3 + "  " + c4 + " " + c5 + "  " + c6 + " " + c7 + "    "
				+ c8 + " " + c9 + "  " + c10 + " " + c11 + "  " + c12 + " " + c13 + "   "
				+ c14 + "  " + c15 + "   " + c16 + "   " + c17 + "   " + c18 + "    "
				+ c19 + "    " + c20 + "   " + c21 + "    " + c22 + "    " + c23);
		}
		if (!log.close()) {
			GenericIO.writelnString("A operação de fecho do ficheiro " + fileName + " falhou!");
			System.exit(1);
		}
	}
}
